package com.wuliu.driver.service;

import com.wuliu.driver.config.RedisConfig;
import com.wuliu.driver.mapper.DriverUserMapper;
import com.wuliu.driver.pojo.DriverUser;
import com.wuliu.driver.util.Code;
import com.wuliu.driver.util.LoginUser;
import com.wuliu.driver.util.Md5Util;
import com.wuliu.driver.util.Result;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class DriverUserServiceImpl implements DriverUserService{
    @Autowired
    private DriverUserMapper driverUserMapper;
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @Override
    //登录方法
    public Result login(DriverUser driverUser) {
        //先去数据库中查询这个用户是否存在
        DriverUser du = driverUserMapper.selectByPhone(driverUser.getPhone());
        if(du!=null){//不为空表示这个用户存在
            //加密一下
            String encrypt = Md5Util.encrypt(driverUser.getPassword());
            //将加密后的密码和数据库中的密码进行比较
            if(du.getPassword().equals(encrypt)){
                LoginUser lu = new LoginUser();
                lu.setName(du.getName());
                lu.setPwd(encrypt);// 加密的密码
                redisTemplate.opsForValue().set(du.getName(), lu);
                //获取jwt
                String jwt= "";
                Calendar calendar = Calendar.getInstance();
                Date time = calendar.getTime();// 当前时间
                calendar.add(Calendar.HOUR, 24);// 日历往后加30分钟
                Date guoqi = calendar.getTime(); // 30分钟之后的时间
                JwtBuilder xx01 = Jwts.builder().setExpiration(guoqi).setIssuedAt(time).signWith(SignatureAlgorithm.HS256, "driver");
                Map mm = new HashMap();
                mm.put("username", du.getName());
                System.out.println("mm----"+mm);// 我们需要把登录的用户名填写在jwt的私有信息中
                xx01.addClaims(mm);// jwt第二个部分中有一个私有信息
                // 通过JwtBuilder对象的compact这个方法来生成JWT字符串
                jwt = xx01.compact();
                // 当我们需要向前端响应多个数据时  直接用Map
                Map ms = new HashMap();
                ms.put("duixiang", du);
                ms.put("token", jwt);
                return new Result(Code.GET_OK,ms,"登录成功");
            }else{
                return new Result(Code.GET_ERR,"密码错误");
            }
        }else{//数据库中不存在这个用户
            String e = Md5Util.encrypt(driverUser.getPassword());//加密密码
            driverUser.setPassword(e);// 将加密后的密码赋值给driverUser
            driverUser.setName("用户"+UUID.randomUUID().toString().substring(12));
            //设置默认头像
            driverUser.setUserpic("https://myoss-shop.oss-cn-beijing.aliyuncs.com/%E9%BB%98%E8%AE%A4%E5%A4%B4%E5%83%8F%20%282%29.png");
            int insert = driverUserMapper.insert(driverUser);
            if (insert>0){
                LoginUser lu = new LoginUser();
                lu.setName(driverUser.getName());
                lu.setPwd(e);// 加密的密码
                redisTemplate.opsForValue().set(driverUser.getName(), lu);
                //获取jwt
                String jwt= "";
                Calendar calendar = Calendar.getInstance();
                Date time = calendar.getTime();// 当前时间
                calendar.add(Calendar.HOUR, 24);// 日历往后加30分钟
                Date guoqi = calendar.getTime(); // 30分钟之后的时间
                JwtBuilder xx01 = Jwts.builder().setExpiration(guoqi).setIssuedAt(time).signWith(SignatureAlgorithm.HS256, "driver");
                Map mm = new HashMap();
                mm.put("username", driverUser.getName());
                System.out.println("mm----"+mm);// 我们需要把登录的用户名填写在jwt的私有信息中
                xx01.addClaims(mm);// jwt第二个部分中有一个私有信息
                // 通过JwtBuilder对象的compact这个方法来生成JWT字符串
                jwt = xx01.compact();
                // 当我们需要向前端响应多个数据时  直接用Map
                Map ms = new HashMap();
                ms.put("duixiang", driverUser);
                ms.put("token", jwt);
                return new Result(Code.GET_OK,ms,"注册成功");
            }else {
                return new Result(Code.GET_ERR,"注册失败");
            }
        }
    }

    @Override
    public Result forget(DriverUser driverUser) {
        //先将密码进行加密
        driverUser.setPassword(Md5Util.encrypt(driverUser.getPassword()));
        //将修改后的密码更新到数据库中
        int i = driverUserMapper.updByPhone(driverUser);
        if(i>0){
            return new Result(Code.UPDATE_OK,"修改成功");
        }
        return new Result(Code.UPDATE_ERR,"修改失败");
    }

    @Override
    public Result code(DriverUser driverUser) {
        DriverUser driverUser1 = driverUserMapper.selectByPhone(driverUser.getPhone());
        if (driverUser1 != null){
            return new Result(Code.GET_OK,driverUser1,"登录成功");
        }
        return new Result(Code.GET_ERR,"用户不存在");
    }
}
